Android Studio 批量打包,apk重命名

项目切换到Android Studio有一段时间了,来聊聊多渠道打包的做法。

1.在productFlavors添加你需要的所有渠道

android {

    productFlavors {  //在这里添加你所有需要打包的渠道
        dev {}
        google {}
        myapp {}
        xiaomi {}
        app360 {}
        wandoujia {}
    }
    //添加如下代码
    productFlavors.all { flavors->
    flavors.manifestPlaceholders=[CHANNEL_VALUE:name]
    }
}



同时修改androidManifest.[xml](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=59fa078c4726fe28&k=xml&k0=xml&kdi0=0&luki=7&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=28fe26478c07fa59&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FAndroid%2F201501%2F380594%2Eshtml&urlid=0)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/[res](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=59fa078c4726fe28&k=res&k0=res&kdi0=0&luki=1&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=28fe26478c07fa59&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FAndroid%2F201501%2F380594%2Eshtml&urlid=0)/android"
    xmlns:[tools](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=59fa078c4726fe28&k=tools&k0=tools&kdi0=0&luki=3&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=28fe26478c07fa59&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FAndroid%2F201501%2F380594%2Eshtml&urlid=0)="http://schemas.android.com/tools"
    package="cn.op.zdf"
    android:versionCode="25"
    android:versionName="3.1.2">


    <application 
        android:name=".myApplication">

        <-- 在manifest中添加如下代码--->
        <meta-data
                    android:name="UMENG_CHANNEL"
                    android:value="${CHANNEL_VALUE}"/>


    </application>


</manifest>

OK,在命令行运行gradle build,大功告成。你可以去喝杯茶了。

2.如何给apk重命名
恩,发布产品的时候我们需要如下的命名规则
release版本的命名规则如下:
产品名称-版本号-渠道号-sign-42.apk

在build.gradle中添加如下代码

//获取时间戳
def getDate() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMddHHmm')
    return formattedDate
}
//从androidManifest.[xml](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=59fa078c4726fe28&k=xml&k0=xml&kdi0=0&luki=7&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=28fe26478c07fa59&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FAndroid%2F201501%2F380594%2Eshtml&urlid=0)中获取版本号
def getVersionNameFromManifest(){
    def manifestParser = new com.android.builder.core.DefaultManifestParser()
    return manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)
}
android{

    //修改生成的apk名字
    [app](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=59fa078c4726fe28&k=app&k0=app&kdi0=0&luki=5&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=28fe26478c07fa59&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FAndroid%2F201501%2F380594%2Eshtml&urlid=0)licationVariants.all{ variant->
        variant.outputs.each { output->
            def oldFile = output.outputFile
            def newName = '';
            if(variant.buildType.name.equals('release')){
//                println(variant.productFlavors[0].name)
                def releaseApkName = 'yjf-android-v' + getVersionNameFromManifest() + '-' + variant.productFlavors[0].name + '-sign-42.apk'
                output.outputFile = new File(oldFile.parent, releaseApkName)
            }
            if(variant.buildType.name.equals('[beta](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=59fa078c4726fe28&k=beta&k0=beta&kdi0=0&luki=4&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=28fe26478c07fa59&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FAndroid%2F201501%2F380594%2Eshtml&urlid=0)')){
                newName = oldFile.name.replace(".apk", "-v" + getVersionNameFromManifest() + "-build" + getDate() + ".apk")
                output.outputFile = new File(oldFile.parent, newName)
            }
            if(variant.buildType.name.equals('debug')){

            }
        }
    }
}

哦,怎么取得版本号?怎么取得渠道号?怎么判断是不是release版本?上面的代码里面都有。
我的项目是从eclipse中迁移过来的,所以我是从manifest文件中读取的版本号,就是上面的那个函数 getVersionNameFromManifest()
如果你的版本号定义在build.gradle中,那defaultConfig.versionName就是你的版本号。

Contents
,